話接上回:
最後我們會遇到一個問題
我們要怎麼輸出上面那串map呢?
你可能會想
cout<<'a'<<eee['a']<<" "<<'b'<<eee['b']<<" "<< ....<<eee['z']<<endl;
太過噁心且沒效率
所以我們來介紹一下 for_each循環
語法:
//for( 宣告類型 變數名稱 : 要被遍歷的容器之變數名稱)
for( int it : eee)
簡單來說,我今天要取出map
裡的東西,我需要另外一個變數
這裡使用:
讓it 指向eee的第一個值也就是 eee['c']
而隨著for
的第一次結束後,it就改會指向eee的第二個值,也就是eee['e']
而隨著for
執行第一次、第二次直到it指向最後一個值後結束for
迴圈
如果你細心一點就會發現,eee不是有兩種類別嗎(char,int)
那到底 it 指的是 key 還是 value 呢
其實兩個都有指到
所以我們在for
迴圈裡的宣告式int
會報錯(it 在指向 key 時會因為類別不同而報錯)
所以者時候會需要一個可以有兩個tpye的宣告式了
寫就是pair 顧名思義 pair 是一對所以我們只要把int
改成pair
就好了!
pair
的用法:
pair<宣告類別1 , 宣告類別2 >
宣告類別1 跟 key 的type一樣
宣告類別2 跟value的type一樣
也就是這樣
for(pair<char,int> it : eee) // char 指向 key (也是char類別) || int 指向 value (也是int類別)
但是我們要怎麼分離 key 與 value 呢 ?
直接結論 :
it.first ==> key
irt.second ==>value
怎麼記住呢
因為我們在宣告時會先宣告key所以是first ,再來才是value 所以是 second
補足程式碼
for(pair<char,int> it : eee)
{
cout<<it.first<<" "<<it.second<<endl;
}
就可以得到以下結果:
c 1
e 1
h 2
l 2
o 1
p 2
如果你懶得記這個pair
也可以用 auto
當 變數接收到什麼型態,他就是那種型態
auto test;
test = 1;//int type
test = "SB";//string type
利用這個原理:
for(auto it : eee)
{
cout<<it.first<<" "<<it.second<<endl;
}
當it.first 時型態為char
當it.second型態為int
ok,以上就是這是的內容
如果你可以看到這裡真的很厲害!!
有任何的疑問歡迎在群組提出喔
接下來我會出一題簡單的題目確定你已經會運用了
最下方有題示,各位可以在留言講自己的解答喔~
承接到最一開始的情境
今天我想第組程式來記錄每位候選人得了幾票
首先會先輸入T,總共有T張票
接下來同一行會依序輸入投票號碼
與名眾名稱
例如 3 tom jolly ==>tom jolly 投給 3 號候選人
然後有以下規則:
投下X
同個人投票兩次以上
投票號碼 > 3(不含3)
視為廢票
測值保證不會有平手的情況
請印出 :當選號碼
投票號碼1
票數
投票號碼2
票數
投票號碼3
票數
廢票
票數
sample input 1:
7
1 jason ho
6 petter li
2 prtter zu
3 liliy hus
2 sume hom
X jetty
2 zuli ho
sample output 1:
2
1 1
2 3
3 1
廢票 2
sample input 2 :
6
1 jason li
3 tom hom
1 tom li
2 jason li
1 uu ja
X ii peak
sample output 2:
1
1 2
2 0
3 1
廢票 2
總之,感謝你看完這篇文章,如果有任何的錯誤或其他指教請告訴我喔~